1 module default_handlers; 2 import std.file; 3 import std.process; 4 import std.path; 5 6 bool openDefaultBrowser(string link) 7 { 8 string command; 9 version(Windows) command = "explorer"; 10 else version(linux) command = "xdg-open"; 11 else version(OSX) command = "open"; 12 return executeShell(command~" "~link).status == 0; 13 } 14 15 version(Windows) 16 bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor) 17 { 18 import core.sys.windows.shellapi; 19 import std.string; 20 char[256] output; 21 void* err = FindExecutableA(toStringz(buildNormalizedPath(referenceFile)), null, output.ptr); 22 if(err <= SE_ERR_ACCESSDENIED) 23 return false; 24 defaultTextEditor = fromStringz(output).idup; 25 return true; 26 } 27 else version(OSX) 28 { 29 import objc.runtime; 30 import objc.meta; 31 alias selector = objc.meta.selector; 32 33 @ObjectiveC extern(C++) final 34 { 35 class NSWorkspace 36 { 37 @selector("sharedWorkspace") 38 static NSWorkspace sharedWorkspace(); 39 40 @selector("URLForApplicationToOpenURL:") 41 NSURL URLForApplicationToOpenURL(NSURL); 42 } 43 } 44 mixin ObjcLinkModule!(default_handlers); 45 mixin ObjcInitSelectors!(__traits(parent, {})); 46 47 bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor) 48 { 49 string base = NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL( 50 NSURL.fileURLWithPath(referenceFile.ns)).path.toString; 51 if(base.length == 0) return false; 52 static bool isExecutable(string name){return name.extension == null;} 53 if(base.extension == ".app") 54 { 55 base~= "/Contents/MacOS/"; 56 foreach(DirEntry e; dirEntries(base, SpanMode.shallow)) 57 { 58 if(isExecutable(e.name)) 59 { 60 defaultTextEditor = e.name; 61 break; 62 } 63 } 64 } 65 return true; 66 } 67 } 68 else version(linux) 69 { 70 bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor) 71 { 72 return false; 73 } 74 } 75